home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / hf / dsp / dsp4tool / dsply.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-15  |  5.2 KB  |  194 lines

  1. /*
  2.  * DSPLY.C -- Graph display module
  3.  *
  4.  *  Copyright (C) 1992, 1993, 1994 by Alef Null. All rights reserved.
  5.  *  Author(s): J Vuori
  6.  *
  7.  *  Modification(s):
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <stdarg.h>
  13. #include <math.h>
  14. #include <graphics.h>
  15. #include "dsply.h"
  16.  
  17. #define DX 512
  18. #define INT(x)    (int)((x)+.5)
  19.  
  20. static int GraphDriver, GraphMode;
  21. static struct {
  22.     int    t, b, l, r;
  23.     int    dx, dy;
  24.     double max, scale;
  25. } dimensions;
  26.  
  27.  
  28. /* print text to the desired location */
  29. static int cdecl gprintf(int color, int xloc, int yloc, char *fmt, ...) {
  30.     va_list argptr;
  31.     char    str[140];
  32.     int     cnt, oldColor;
  33.  
  34.     va_start(argptr, fmt);
  35.  
  36.     cnt = vsprintf(str, fmt, argptr);
  37.     oldColor = getcolor(); setcolor(color);
  38.     outtextxy(xloc, yloc, str);
  39.     setcolor(oldColor);
  40.  
  41.     va_end(argptr);
  42.  
  43.     return(cnt);
  44. }
  45.  
  46.  
  47. /*
  48.  * Initializes display
  49.  *
  50.  *  n     is the number of points to be plotted
  51.  *  logo is logo text to be printed on the screen
  52.  *
  53.  *  returns -1 if errors, 0 otherwise
  54.  */
  55. int InitDisplay(int n, char *logo[]) {
  56.     struct viewporttype     vp;
  57.     double            xyratio, f;
  58.     int                 ErrorCode,
  59.                 k,
  60.                 xasp, yasp;
  61.  
  62.     /* first setup driver */
  63.     if(registerbgidriver(EGAVGA_driver) < 0) {
  64.     fprintf(stderr, "Graphics System Error: Can't load internal display driver\n");
  65.     return (-1);
  66.     }
  67.     GraphDriver = DETECT;
  68.     initgraph(&GraphDriver, &GraphMode, "");
  69.     ErrorCode = graphresult();
  70.     if(ErrorCode != grOk) {
  71.     fprintf(stderr, "Graphics System Error: %s\n", grapherrormsg(ErrorCode));
  72.     return (-1);
  73.     }
  74.     restorecrtmode();
  75.  
  76.     /* then calculate dimensions */
  77.     setgraphmode(GraphMode);
  78.     getviewsettings(&vp); getaspectratio(&xasp, &yasp);
  79.     xyratio      = (double) (vp.bottom - vp.top) / (double) (vp.right - vp.left) * (double) yasp / (double) xasp;
  80.     dimensions.t  = ((vp.bottom - vp.top) - (int) ((double) n * xyratio * 0.8)) / 2;
  81.     dimensions.b  = dimensions.t + (int) ((double) n * xyratio * 0.8);
  82.     dimensions.l  = ((vp.right - vp.left) - n) / 2;
  83.     dimensions.r  = dimensions.l + n;
  84.     dimensions.dx = dimensions.r - dimensions.l;
  85.     dimensions.dy = dimensions.b - dimensions.t;
  86.  
  87.     /* put text lines */
  88.     k = 0;
  89.     settextjustify(CENTER_TEXT, TOP_TEXT);
  90.     gprintf(WHITE, dimensions.dx/2+dimensions.l, k += textheight("0"), "%s", *logo++);
  91.  
  92.     /* put horizontal ticks */
  93.     for (f = dimensions.l; f <= dimensions.r; f += (double)dimensions.dx/8.0) {
  94.     gprintf(LIGHTGRAY, INT(f), dimensions.b+dimensions.dy/50+textheight("0"), "%d", INT(((double)f - (double)dimensions.l) / (double)dimensions.dx * n));
  95.     line(INT(f), dimensions.b, INT(f), dimensions.b+dimensions.dy/50);
  96.     }
  97.     gprintf(LIGHTGRAY, dimensions.r, dimensions.b+dimensions.dy/50+3*textheight("0"), *logo++);
  98.  
  99.     /* put vertical ticks */
  100.     settextjustify(RIGHT_TEXT, CENTER_TEXT);
  101.     for (f = dimensions.b; f > dimensions.t; f -= (double)dimensions.dy/5.0)
  102.     line(dimensions.l-dimensions.dx/90, INT(f), dimensions.l, INT(f));
  103.     settextjustify(LEFT_TEXT, CENTER_TEXT);
  104.     gprintf(LIGHTGRAY, 0, dimensions.t, *logo++);
  105.  
  106.     settextjustify(CENTER_TEXT, TOP_TEXT);
  107.     while (*logo != NULL)
  108.     gprintf(LIGHTGRAY, dimensions.dx/2+dimensions.l, k += textheight("0"), "%s", *logo++);
  109.  
  110.     /* put frame */
  111.     rectangle(dimensions.l, dimensions.t, dimensions.r, dimensions.b);
  112.  
  113.     /* set plotting viewport (and clipping mode) */
  114.     setviewport(dimensions.l+1, dimensions.t+1, dimensions.r-1, dimensions.b-1, 1);
  115.  
  116.     return (0);
  117. }
  118.  
  119.  
  120. /*
  121.  * Start plotting
  122.  */
  123. void PlotStart(double min, double max) {
  124.     struct linesettingstype lineinfo;
  125.     double                  f;
  126.     int             oldColor;
  127.  
  128.     getlinesettings(&lineinfo);
  129.     oldColor = getcolor();
  130.  
  131.     clearviewport();
  132.  
  133.     dimensions.max   = max;
  134.     dimensions.scale = (double) dimensions.dy / ((min == max) ? 1.0 : (max - min));
  135.  
  136.     /* put horizontal ticks */
  137.     setcolor(LIGHTGRAY); setlinestyle(1, lineinfo.upattern, lineinfo.thickness);
  138.     for (f = (double)dimensions.dx/8.0; f < dimensions.dx; f += (double)dimensions.dx/8.0)
  139.     line(INT(f), 0, INT(f), dimensions.dy);
  140.  
  141.     /* put vertical ticks */
  142.     for (f = dimensions.dy; f > 0; f -= (double)dimensions.dy/5.0) {
  143.     line(0, INT(f), dimensions.dx, INT(f));
  144.     }
  145.     setlinestyle(lineinfo.linestyle, lineinfo.upattern, lineinfo.thickness);
  146.  
  147.     /* plot zero line if needed */
  148.     setcolor(LIGHTBLUE);
  149.     line(0, INT(dimensions.max * dimensions.scale), dimensions.dx, INT(dimensions.max * dimensions.scale));
  150.     setcolor(oldColor);
  151.  
  152. }
  153.  
  154.  
  155. /*
  156.  * Plot one data value
  157.  */
  158. void PlotLine(int x, double yy) {
  159.     static int prev[DX];
  160.     int        y    = INT((dimensions.max - yy) * dimensions.scale);
  161.     int        oldColor = getcolor();
  162.  
  163.     setcolor(YELLOW);
  164.     if (x) {
  165.     moveto(x-1, prev[x-1]);
  166.     lineto(x,   y);
  167.     }
  168.     setcolor(oldColor);
  169.  
  170.     prev[x] = y;
  171. }
  172.  
  173.  
  174. /*
  175.  * Plot circle
  176.  */
  177. void PlotCircle(int x, double yy) {
  178.     int y     = INT((dimensions.max - yy) * dimensions.scale);
  179.     int oldColor = getcolor();
  180.  
  181.     setcolor(YELLOW);
  182.     circle(x, y, 3);
  183.     setcolor(oldColor);
  184.  
  185. }
  186.  
  187.  
  188. /*
  189.  * releases display
  190.  */
  191. void ReleaseDisplay(void) {
  192.     closegraph();
  193. }
  194.